package com.yy.wga.mp.module.pay.request.third;

import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;

import java.util.List;

/**
 * 微信支付回调解密后内容
 */
@Data
public class WechatPayNotifyDecodeRequest {

    /**
     * 应用ID
     */
    @JSONField(name = "appid")
    private String appId;

    /**
     * 商户号
     */
    @JSONField(name = "mchid")
    private String mchId;

    /**
     * 商户订单号
     */
    @JSONField(name = "out_trade_no")
    private String outTradeNo;

    /**
     * 微信支付订单号
     */
    @JSONField(name = "transaction_id")
    private String transactionId;

    /**
     * 交易类型
     * JSAPI：公众号支付
     * NATIVE：扫码支付
     * APP：APP支付
     * MICROPAY：付款码支付
     * MWEB：H5支付
     * FACEPAY：刷脸支付
     */
    @JSONField(name = "trade_type")
    private String tradeType;

    /**
     * 交易状态
     * SUCCESS：支付成功
     * REFUND：转入退款
     * NOTPAY：未支付
     * CLOSED：已关闭
     * REVOKED：已撤销（付款码支付）
     * USERPAYING：用户支付中（付款码支付）
     * PAYERROR：支付失败(其他原因，如银行返回失败)
     * ACCEPT：已接收，等待扣款
     */
    @JSONField(name = "trade_state")
    private String tradeState;
    /**
     * 类型见https://pay.weixin.qq.com/wiki/doc/apiv3/terms_definition/chapter1_1_3.shtml#part-6
     */
    @JSONField(name = "bank_type")
    private String bankType;
    /**
     * 附加数据
     */
    private String attach;

    /**
     * 支付完成时间 格式：YYYY-MM-DDTHH:mm:ss+TIMEZONE
     */
    @JSONField(name = "success_time")
    private String successTime;

    /**
     * 支付者
     */
    private PayerDTO payer;

    /**
     * 订单金额
     */
    private AmountDTO amount;

    /**
     * 场景信息
     */
    @JSONField(name = "scene_info")
    private SceneInfoDTO sceneInfo;

    /**
     * 优惠功能
     */
    @JSONField(name = "promotion_detail")
    private List<PromotionDetailDTO> promotionDetail;

    @Data
    public static class PayerDTO {
        /**
         * 用户标识
         */
        @JSONField(name = "openid")
        private String openId;
    }

    @Data
    public static class AmountDTO {
        /**
         * 总金额
         */
        private Long total;

        /**
         * 用户支付金额，单位为分。
         */
        @JSONField(name = "payer_total")
        private Long payerTotal;

        /**
         * CNY：人民币，境内商户号仅支持人民币。
         */
        private String currency;

        /**
         * 用户支付币种
         */
        @JSONField(name = "payer_currency")
        private String payerCurrency;
    }

    @Data
    public static class SceneInfoDTO {
        /**
         * 商户端设备号
         */
        private String device_id;
    }

    @Data
    public static class PromotionDetailDTO {
        /**
         * 券ID
         */
        private String coupon_id;

        /**
         * 优惠名称
         */
        private String name;

        /**
         *  优惠范围
         *  GLOBAL：全场代金券
         *  SINGLE：单品优惠
         */
        private String scope;

        /**
         * 优惠类型
         * CASH：充值
         * NOCASH：预充值
         */
        private String type;

        /**
         * 优惠券面额
         */
        private Long amount;

        /**
         * 活动ID
         */
        @JSONField(name = "stock_id")
        private String stockId;

        /**
         * 微信出资
         */
        @JSONField(name = "wechatpay_contribute")
        private Integer wechatpayContribute;

        /**
         * 商户出资
         */
        @JSONField(name = "merchant_contribute")
        private Integer merchantContribute;
        /**
         * 其他出资
         */
        @JSONField(name = "other_contribute")
        private Integer otherContribute;

        /**
         * 优惠币种
         */
        private String currency;

        /**
         * 单品列表
         */
        @JSONField(name = "goods_detail")
        private List<GoodsDetailDTO> goodsDetail;


        @Data
        public static class GoodsDetailDTO {
            /**
             * 商品编码
             */
            @JSONField(name = "goods_id")
            private String goodsId;

            /**
             * 商品数量
             */
            private Integer quantity;

            /**
             * 商品单价
             */
            @JSONField(name = "unit_price")
            private Long unitPrice;

            /**
             * 商品优惠金额
             */
            @JSONField(name = "discount_amount")
            private Long discountAmount;

            /**
             * 商品备注
             */
            @JSONField(name = "goods_remark")
            private String goodsRemark;
        }
    }
}
